package com.starry.db.core.handler;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.starry.core.security.context.SecurityInfoContext;
import com.starry.db.core.entity.BaseEntity;
import org.apache.ibatis.reflection.MetaObject;

import java.time.LocalDateTime;
import java.util.Objects;

/**
 * 通用参数填充实现类
 *
 * @Author xiaoke
 */
public class DefaultDBFieldHandler implements MetaObjectHandler {

    @Override
    public void insertFill(MetaObject metaObject) {
        if (Objects.nonNull(metaObject) && metaObject.getOriginalObject() instanceof BaseEntity baseEntity) {
            LocalDateTime current = LocalDateTime.now();
            // 创建时间为空，则以当前时间为插入时间
            if (Objects.isNull(baseEntity.getCreateTime())) {
                baseEntity.setCreateTime(current);
            }
            // 更新时间为空，则以当前时间为更新时间
            if (Objects.isNull(baseEntity.getUpdateTime())) {
                baseEntity.setUpdateTime(current);
            }

            // 用户信息不为空，则填充用户信息
            Long userId = SecurityInfoContext.getUserId();
            // 创建人ID为空，则以当前用户ID为创建人ID
            if (Objects.nonNull(userId) && Objects.isNull(baseEntity.getCreateId())) {
                baseEntity.setCreateId(userId);
            }
            // 更新人ID为空，则以当前用户ID为更新人ID
            if (Objects.nonNull(userId) && Objects.isNull(baseEntity.getUpdateId())) {
                baseEntity.setUpdateId(userId);
            }
            String userName = SecurityInfoContext.getUsername();
            // 创建人名称为空，则以当前用户名称为创建人名称
            if (Objects.nonNull(userName) && Objects.isNull(baseEntity.getCreateName())) {
                baseEntity.setCreateName(userName);
            }
            // 更新人名称为空，则以当前用户名称为更新人名称
            if (Objects.nonNull(userName) && Objects.isNull(baseEntity.getUpdateName())) {
                baseEntity.setUpdateName(userName);
            }
        }

    }

    @Override
    public void updateFill(MetaObject metaObject) {
        if (Objects.nonNull(metaObject) && metaObject.getOriginalObject() instanceof BaseEntity baseEntity) {
            LocalDateTime current = LocalDateTime.now();
            baseEntity.setUpdateTime(current);
            // 用户信息不为空，则填充用户信息
            Long userId = SecurityInfoContext.getUserId();
            // 更新人ID为空，则以当前用户ID为更新人ID
            if (Objects.nonNull(userId)) {
                baseEntity.setUpdateId(userId);
            }
            String userName = SecurityInfoContext.getUsername();
            // 更新人名称为空，则以当前用户名称为更新人名称
            if (Objects.nonNull(userName)) {
                baseEntity.setUpdateName(userName);
            }
        }
    }
}
